import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.util.*;
import java.awt.*;
/**
 * Write a description of class Aspire here.
 * 
 * @author Victor Yael Ruiz Alvarado 
 * @version (a version number or a date)
 */
public class Aspire extends World
{
    // instance variables - replace the example below with your own
    public int niv=1;   
    private static final String scoreLabel = "Felicidades pasaste de nivel";
    
    private GreenfootImage box;
    public Jugador jugador= new Jugador();
    public PC pc= new PC();
    public Score scoretab= new Score();
    public Scorepc scorep= new Scorepc();
    public Nivel nivel=new Nivel();
    public muestranivel muestra= new muestranivel();
    private int num = 3; //numero de esteriodes
    public int score = 0; //contador del puntaje del jugador
    public int scorp = 0; //contador del puntaje del PC
    public int lives = 7; //contador de las vidas del jugador
    public int livesPC = 100; //contador de las vidas del PC
    public int gx=0; //coordenada x de los enemigos
    public int px=0; //coordenada x de los poderes
    public int py=0; //coordenada y de los poderes
    public int pb=0; //contador del numero de poderes
    public int set=0; //variable para saber cuando eliminar el objeto que muestra un mesje
    public int wait=0; //variable para esperar antes de elimar el mensaje
    public int over=0; //para saber si se termino el juego
    private boolean i = false; //para saber si se empiesa el jeugo
    private Boton jugar = new Boton("play.png");//Boton Jugar
    private Boton ayuda = new Boton("ayuda.png");//Boton Ayuda
    private Boton creditos = new Boton("creaditos.png");//Boton Creditos
    private Boton atras = new Boton("backbutton.png");//Boton Atras
    /**Constructor del escenario*/
    public Aspire()
    {
     super(700, 600, 1); 
     cargaMenu();//carga el menu 
     
    }
    /**Metodo Actua del juego.
     * Es el  metodo principar para la realizacion del juego.
     */
    public void act()
    {
     if(i){
     if(Greenfoot.getRandomNumber(10)==4) /**random para que se agrege un poder al azar*/
     addpoder(); 
     if(set==1) /**si set 1 se creo el mensje y se elminiara a cuando wait llege a 100*/
     {
     if(wait==100){
      removeObject(nivel);
      wait=0;
      set=0;
     }
     else
      wait++;
     }
     if((score+scorp)>=90&&niv==1){
     addObject(nivel,400,300);
     addPoder3(); 
     addAsteroids(1);
     addEnemigo2(15);
     set=1;
     niv=2;
     }
     if((score+scorp)>=390&&niv==2){
     addObject(nivel,400,300);
     addPoder3(); 
     addAsteroids(1);
     addEnemigo3(20);
     set=1;
     niv=3;
     }
     if((score+scorp)>=990&&niv==3){
     addObject(nivel,400,300);
     addPoder3(); 
     addAsteroids(1);
     addEnemigo1(10);
     addEnemigo2(5);
     addEnemigo3(10);
     set=1;
     niv=4;
     }
     if((score+scorp)>=1490&&niv==4){
     addPoder3(); 
     niv=5;
     }    
     if(lives<=0&&over==0){
        addObject(new Gameover(),400,300);
        Greenfoot.playSound("epic.wav");
        over=1;
        }
        
     if(livesPC<=0&&over==0){
        if(getScore()<getScorep())
        {
         addObject(new winpc(),400,300);   
         Greenfoot.playSound("epic.wav");
        }
        else{
        addObject(new Win(),400,300);
        Greenfoot.playSound("win.wav");
        over=1;}
        }}
     checaBotones();
    }
    
    /**se encarga de agregar los enmigos de tipo2 */ 
    private void addAsteroids(int count) 
    {
        for(int i = 0; i < count; i++) 
        {
            int x = Greenfoot.getRandomNumber(getWidth());
            int y = Greenfoot.getRandomNumber(getHeight()-150);
            addObject(new Asteroid(), x, y);
        }
    }
    /**se encarga de agregar los enmigos de   */ 
    private void addEnemigo2(int count)
    {
        for(int i = 0; i < count; i++)
        {
          int x = Greenfoot.getRandomNumber(getWidth());
          int y = Greenfoot.getRandomNumber(getHeight()/2+200);
          addObject(new Enemigo2(), x, y);
        }
    }
    
    /**se encarga de agregar los enmigos de tipo 1 */ 
    private void addEnemigo1(int count)
    {
        for(int i = 0; i < count; i++)
        {
        int x = Greenfoot.getRandomNumber(getWidth()-1);
        int y = Greenfoot.getRandomNumber(getHeight()/2+200);
        addObject(new Enemigo1(), x, y);
    }
    }
    
    /**se encarga de agregar los enmigos de tipo 3*/ 
    private void addEnemigo3(int count)
    {
        for(int i = 0; i < count; i++)
        {
        int x = Greenfoot.getRandomNumber(getWidth()-1);
        int y = Greenfoot.getRandomNumber(getHeight()/2+200);;
        addObject(new Enemigo3(), x, y);
    }
    }
    
    /**se encarga de agregar las vidas*/ 
    private void addPoder1()
    {
        
            int x = Greenfoot.getRandomNumber(getWidth());
            int y = 10;
            addObject(new Vidas(), x, y);
            countpod(1);
     }
     
    /**se encarga de agregar el escudo */ 
    private void addPoder2()
    {
            int x = Greenfoot.getRandomNumber(getHeight());
            int y = 10;
            addObject(new Escudo(), x, y);
            countpod(1);
    }
    
    /**se encarga de agregar el poder de balas */ 
    private void addPoder3()
    {
            int x = Greenfoot.getRandomNumber(getHeight());
            int y = 10;
            addObject(new Poderbala(), x, y);
            countpod(1);
    }
    /**agreda uno de los 3 poderes dependiendo del random*/
    private void addpoder(){
    if(Greenfoot.getRandomNumber(150)==14)   
     addPoder1();
     if(Greenfoot.getRandomNumber(150)==14) 
     addPoder2();   
     if(Greenfoot.getRandomNumber(150)==14) 
     addPoder3(); 
    }
    
    /**los siguientes metodos son para poder acceder a los puntos,el nivel,las vidas,
     * coordenadas en cualquier clase*/
    public int getNivel() {
        return niv;
    }
    
    public void addScore(int l) {
        score+=l;
    }
    
    public int getScore() {
        return score;
    }
    
    public void addScorep(int l) {
        scorp+=l;
    }
    
    public int getScorep() {
        return scorp;
    }
    
    public void loseLife() {
        lives--;
    }
    
    public void addLife(int l) {
        lives+=l;
    }
    
    public int getLives() {
        return lives;
    }
    
    public void loseLifePc(int p) {
        livesPC-=p;
    }
    
    public void addLifePc(int p) {
        livesPC+=p;
    }
    
    public int getLivesPc() {
        return livesPC;
    }
    
    public void retx(int o){
        gx=o;
    }
    
    public int getx(){
        return gx;
    }
    
    public int getxpod(){
        return px;
    }
    
    public int getypod(){
        return py;
    }
    
    public void retxpod(int o){
        px=o;
    }
    
    public void retypod(int c){
        py=c;
    }
    
    public void countpod(int b){
        pb+=b;
    }
    
    public int cotpod(){
        return(pb);
    }
    
    /**
     * se encarga de agregar los objetos del menu al escenario,para cargar la vista del menu.
     */
    public void cargaMenu(){
        setBackground("fondo.png");
        addObject(jugar,580,290);
        addObject(ayuda,100,320);
        addObject(creditos,550,500);
        removeObject(atras);
    }
    
    /** se encarga  checar cual boton se a presionado */
    public void checaBotones(){
        
        if(jugar.getPresionado()){
            
           jugar.setPresionado(false);
           remueveMenu();
           cargaobjetos();
           i=true;
        }
        else if(ayuda.getPresionado()){
            ayuda.setPresionado(false);
            remueveMenu();
            setBackground("moon.png");
            addObject(atras,620,540);
        }
        else if(creditos.getPresionado()){
            creditos.setPresionado(false);
            remueveMenu();
            setBackground("portada.png");
            addObject(atras,620,540);
        }
        else
        
        if(atras.getPresionado()){
            atras.setPresionado(false);
            cargaMenu();
            i=false;
        }
    }
    
    /** se encarga  poner en el mundo los objetos del nivel uno */
    public void cargaobjetos()
    {
     setBackground("space1.jpg");
     addObject(jugador,350,550);
     addAsteroids(num);
     addEnemigo1(9);
     addPoder1();
     addPoder2();
     addObject(scoretab, 50, 29);
     addObject(scorep, 650, 29);
     addObject(muestra,30,590);
     addObject(pc,300,550);
    }
    
    /**se encarga de remover los objetos del menu*/
    public void remueveMenu(){
        removeObject(jugar);
        removeObject(ayuda);
        removeObject(creditos);
       
    }
}
